package com.niit.plugins;

import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;

import java.lang.reflect.Method;

// args: 是query方法的全部参数的类型
@Intercepts({
        @Signature(type = Executor.class,method = "query",
                args = {MappedStatement.class,Object.class,RowBounds.class, ResultHandler.class})
})
public class LogPlugin implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // TODO 就是在方法执行之前，实现我们自己的逻辑
        System.out.println("select语句执行之前，doSomething.....");
        Method method = invocation.getMethod();
        System.out.println("执行了"+method.getName()+"方法");

        // 获取 query方法参数列表
        Object[] args = invocation.getArgs();
        // 获取SQL语句的信息
        MappedStatement ms = (MappedStatement)args[0];
        System.out.println("参数是："+ms.getId());

        // 获取并打印正在执行的SQL语句
        String sql = ms.getBoundSql(args[1]).getSql();
        System.out.println("正在执行的SQL语句是：" + sql);

        Object result = invocation.proceed(); //执行原来的方法调用


        System.out.println("select语句执行之后，doSomething.....");
        // TODO 就是在方法执行之后，实现我们自己的逻辑
        return result;
    }
}
